package lq505;

import java.util.Scanner;
/*
lq505
输入数据
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

 * 
 * */
//记录左下或右下的步数
class Step{
	public int l,r;

	public Step(int l, int r) {
		this.l = l;
		this.r = r;
	}

	@Override
	public String toString() {
		return "Step [l=" + l + ", r=" + r + "]";
	}
	
	
}
public class Main {

	static int N;
	static int[][] sj;
	static Step[][] lr;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		
		//创建矩阵存放三角形
		//初始化每个单元格为无效数
		sj = new int[N][2*N+1];
		for(int i=0;i<N;i++) 
			for(int j=0;j<2*N+1;j++) 
				sj[i][j] = -1;
		
		//创建矩阵存放每个格子的左右步数
		lr = new Step[N][2*N+1];
		
		//三角形每行前面空的单元数量N-i-1，i为行数0开始计数
		for(int i=0;i<N;i++) {
			//每行读取i+1个数
			for(int j=0;j<=i;j++) {
				//每行开始写数的位置N-1-(i+1)即N-i
				sj[i][N-i+2*j] = sc.nextInt();
				//每个数字单元格对应的步数都初始化为l，r为0
				lr[i][N-i+2*j] = new Step(0,0);
			}
		}
		
		//输出sj
		/*
		for(int i=0;i<N;i++) {
			for(int j=0;j<2*N+1;j++) {
				System.out.printf("%3d,",sj[i][j]);
			}
			System.out.println();
		}
		*/
		
		//从sj的第二行开始更新每行的数字
		//每个有效单元格都是自身数字加上左上和右上取大的
		for(int i=1;i<N;i++) {
			for(int j=0;j<2*N+1;j++) {
				if(sj[i][j]==-1)
					continue;
				//左上和右上
				int lu,ru;
				//lu判断有效性
				if(sj[i-1][j-1]!=-1)
					lu = sj[i-1][j-1];
				else
					lu = 0;
				//ru判断有效性
				if(sj[i-1][j+1]!=-1)
					ru = sj[i-1][j+1];
				else
					ru = 0;
				
				//sj[i][j] += Math.max(lu, ru);
				if(lu>ru) {
					//从上至下向左走
					sj[i][j] += lu;
					//获取上一个单元格的步数然后左加一
					lr[i][j].r = lr[i-1][j-1].r;
					lr[i][j].l = lr[i-1][j-1].l;
					lr[i][j].l++;
				}else {
					//从上至下向右走
					sj[i][j] += ru;
					//获取上一个单元格的步数然后右加一
					lr[i][j].r = lr[i-1][j+1].r;
					lr[i][j].l = lr[i-1][j+1].l;
					lr[i][j].r++;
				}
				
			}
		}
		
		/*
		System.out.println("----------------------");
		//输出sj
		for(int i=0;i<N;i++) {
			for(int j=0;j<2*N+1;j++) {
				System.out.printf("%3d,",sj[i][j]);
			}
			System.out.println();
		}
		
		//输出最后一行的lr
		for(int j=0;j<2*N+1;j++) {
			if(lr[N-1][j]!=null)
				System.out.printf("%s,", lr[N-1][j]);
		}
		System.out.println();
		*/
		
		//最后一行找值最大且l和r差的绝对值小于等一1的值
		int ans=0;
		for(int j=0;j<2*N+1;j++) {
			if(sj[N-1][j] == -1)
				continue;
			if(ans<sj[N-1][j]&&Math.abs(lr[N-1][j].l-lr[N-1][j].r)<=1) {
				ans = sj[N-1][j];
			}
		}
		
		
		
		
		System.out.println(ans);
	}

}
